/*
给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表，其中包含 两棵树 中的所有整数并按 升序 排序。.

 

示例 1：



输入：root1 = [2,1,4], root2 = [1,0,3]
输出：[0,1,1,2,3,4]
示例 2：



输入：root1 = [1,null,8], root2 = [8,1]
输出：[1,1,8,8]
 

提示：

每棵树的节点数在 [0, 5000] 范围内
-105 <= Node.val <= 105

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/all-elements-in-two-binary-search-trees
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

#include "../stdc++.h"

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> getAllElements(TreeNode* root1, TreeNode* root2) {
        vector<int> nums1;
        vector<int> nums2;
        inorder(root1, nums1);
        inorder(root2, nums2);

        vector<int> res;
        auto p1 = nums1.begin();
        auto p2 = nums2.begin();
        while (true) {
            if (p1 == nums1.end()) {
                res.insert(res.end(), p2, nums2.end());
                break;
            }
            if (p2 == nums2.end()) {
                res.insert(res.end(), p1, nums1.end());
                break;
            }
            if (*p1 < *p2) {
                res.emplace_back(*p1);
                ++p1;
            } else {
                res.emplace_back(*p2);
                ++p2;
            }
        }
        return res;
    }
private:
    void inorder(TreeNode* root, vector<int>& nums) {
        if (root == nullptr) {
            return;
        }
        inorder(root->left, nums);
        nums.emplace_back(root->val);
        inorder(root->right, nums);
    }
};
